/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.controler;

import com.camachosanchez.bean.ControlReencauche;
import com.camachosanchez.bean.DetalleControlReencauche;
import com.camachosanchez.bean.DistribuidoresNeumaticos;
import com.camachosanchez.bean.Usuarios;
import com.camachosanchez.controler.exceptions.IllegalOrphanException;
import com.camachosanchez.controler.exceptions.NonexistentEntityException;
import com.camachosanchez.util.JPAUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Query;

/**
 *
 * @author ZULLY
 */
public class ControlReencaucheJpaController implements Serializable {

    public ControlReencaucheJpaController(EntityManagerFactory emf) {
        this.emf = JPAUtil.getEntityManagerFactory();
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ControlReencauche controlReencauche) {
        if (controlReencauche.getDetalleControlReencaucheList() == null) {
            controlReencauche.setDetalleControlReencaucheList(new ArrayList<DetalleControlReencauche>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Usuarios idUsuario = controlReencauche.getIdUsuario();
            if (idUsuario != null) {
                idUsuario = em.getReference(idUsuario.getClass(), idUsuario.getId());
                controlReencauche.setIdUsuario(idUsuario);
            }
            DistribuidoresNeumaticos idDistribuidorNeumaticos = controlReencauche.getIdDistribuidorNeumaticos();
            if (idDistribuidorNeumaticos != null) {
                idDistribuidorNeumaticos = em.getReference(idDistribuidorNeumaticos.getClass(), idDistribuidorNeumaticos.getId());
                controlReencauche.setIdDistribuidorNeumaticos(idDistribuidorNeumaticos);
            }
            List<DetalleControlReencauche> attachedDetalleControlReencaucheList = new ArrayList<DetalleControlReencauche>();
            for (DetalleControlReencauche detalleControlReencaucheListDetalleControlReencaucheToAttach : controlReencauche.getDetalleControlReencaucheList()) {
                detalleControlReencaucheListDetalleControlReencaucheToAttach = em.getReference(detalleControlReencaucheListDetalleControlReencaucheToAttach.getClass(), detalleControlReencaucheListDetalleControlReencaucheToAttach.getId());
                attachedDetalleControlReencaucheList.add(detalleControlReencaucheListDetalleControlReencaucheToAttach);
            }
            controlReencauche.setDetalleControlReencaucheList(attachedDetalleControlReencaucheList);
            em.persist(controlReencauche);
            if (idUsuario != null) {
                idUsuario.getControlReencaucheList().add(controlReencauche);
                idUsuario = em.merge(idUsuario);
            }
            if (idDistribuidorNeumaticos != null) {
                idDistribuidorNeumaticos.getControlReencaucheList().add(controlReencauche);
                idDistribuidorNeumaticos = em.merge(idDistribuidorNeumaticos);
            }
            for (DetalleControlReencauche detalleControlReencaucheListDetalleControlReencauche : controlReencauche.getDetalleControlReencaucheList()) {
                ControlReencauche oldIdControlReencaucheOfDetalleControlReencaucheListDetalleControlReencauche = detalleControlReencaucheListDetalleControlReencauche.getIdControlReencauche();
                detalleControlReencaucheListDetalleControlReencauche.setIdControlReencauche(controlReencauche);
                detalleControlReencaucheListDetalleControlReencauche = em.merge(detalleControlReencaucheListDetalleControlReencauche);
                if (oldIdControlReencaucheOfDetalleControlReencaucheListDetalleControlReencauche != null) {
                    oldIdControlReencaucheOfDetalleControlReencaucheListDetalleControlReencauche.getDetalleControlReencaucheList().remove(detalleControlReencaucheListDetalleControlReencauche);
                    oldIdControlReencaucheOfDetalleControlReencaucheListDetalleControlReencauche = em.merge(oldIdControlReencaucheOfDetalleControlReencaucheListDetalleControlReencauche);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ControlReencauche controlReencauche) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ControlReencauche persistentControlReencauche = em.find(ControlReencauche.class, controlReencauche.getId());
            Usuarios idUsuarioOld = persistentControlReencauche.getIdUsuario();
            Usuarios idUsuarioNew = controlReencauche.getIdUsuario();
            DistribuidoresNeumaticos idDistribuidorNeumaticosOld = persistentControlReencauche.getIdDistribuidorNeumaticos();
            DistribuidoresNeumaticos idDistribuidorNeumaticosNew = controlReencauche.getIdDistribuidorNeumaticos();
            List<DetalleControlReencauche> detalleControlReencaucheListOld = persistentControlReencauche.getDetalleControlReencaucheList();
            List<DetalleControlReencauche> detalleControlReencaucheListNew = controlReencauche.getDetalleControlReencaucheList();
            List<String> illegalOrphanMessages = null;
            for (DetalleControlReencauche detalleControlReencaucheListOldDetalleControlReencauche : detalleControlReencaucheListOld) {
                if (!detalleControlReencaucheListNew.contains(detalleControlReencaucheListOldDetalleControlReencauche)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain DetalleControlReencauche " + detalleControlReencaucheListOldDetalleControlReencauche + " since its idControlReencauche field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (idUsuarioNew != null) {
                idUsuarioNew = em.getReference(idUsuarioNew.getClass(), idUsuarioNew.getId());
                controlReencauche.setIdUsuario(idUsuarioNew);
            }
            if (idDistribuidorNeumaticosNew != null) {
                idDistribuidorNeumaticosNew = em.getReference(idDistribuidorNeumaticosNew.getClass(), idDistribuidorNeumaticosNew.getId());
                controlReencauche.setIdDistribuidorNeumaticos(idDistribuidorNeumaticosNew);
            }
            List<DetalleControlReencauche> attachedDetalleControlReencaucheListNew = new ArrayList<DetalleControlReencauche>();
            for (DetalleControlReencauche detalleControlReencaucheListNewDetalleControlReencaucheToAttach : detalleControlReencaucheListNew) {
                detalleControlReencaucheListNewDetalleControlReencaucheToAttach = em.getReference(detalleControlReencaucheListNewDetalleControlReencaucheToAttach.getClass(), detalleControlReencaucheListNewDetalleControlReencaucheToAttach.getId());
                attachedDetalleControlReencaucheListNew.add(detalleControlReencaucheListNewDetalleControlReencaucheToAttach);
            }
            detalleControlReencaucheListNew = attachedDetalleControlReencaucheListNew;
            controlReencauche.setDetalleControlReencaucheList(detalleControlReencaucheListNew);
            controlReencauche = em.merge(controlReencauche);
            if (idUsuarioOld != null && !idUsuarioOld.equals(idUsuarioNew)) {
                idUsuarioOld.getControlReencaucheList().remove(controlReencauche);
                idUsuarioOld = em.merge(idUsuarioOld);
            }
            if (idUsuarioNew != null && !idUsuarioNew.equals(idUsuarioOld)) {
                idUsuarioNew.getControlReencaucheList().add(controlReencauche);
                idUsuarioNew = em.merge(idUsuarioNew);
            }
            if (idDistribuidorNeumaticosOld != null && !idDistribuidorNeumaticosOld.equals(idDistribuidorNeumaticosNew)) {
                idDistribuidorNeumaticosOld.getControlReencaucheList().remove(controlReencauche);
                idDistribuidorNeumaticosOld = em.merge(idDistribuidorNeumaticosOld);
            }
            if (idDistribuidorNeumaticosNew != null && !idDistribuidorNeumaticosNew.equals(idDistribuidorNeumaticosOld)) {
                idDistribuidorNeumaticosNew.getControlReencaucheList().add(controlReencauche);
                idDistribuidorNeumaticosNew = em.merge(idDistribuidorNeumaticosNew);
            }
            for (DetalleControlReencauche detalleControlReencaucheListNewDetalleControlReencauche : detalleControlReencaucheListNew) {
                if (!detalleControlReencaucheListOld.contains(detalleControlReencaucheListNewDetalleControlReencauche)) {
                    ControlReencauche oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche = detalleControlReencaucheListNewDetalleControlReencauche.getIdControlReencauche();
                    detalleControlReencaucheListNewDetalleControlReencauche.setIdControlReencauche(controlReencauche);
                    detalleControlReencaucheListNewDetalleControlReencauche = em.merge(detalleControlReencaucheListNewDetalleControlReencauche);
                    if (oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche != null && !oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche.equals(controlReencauche)) {
                        oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche.getDetalleControlReencaucheList().remove(detalleControlReencaucheListNewDetalleControlReencauche);
                        oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche = em.merge(oldIdControlReencaucheOfDetalleControlReencaucheListNewDetalleControlReencauche);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = controlReencauche.getId();
                if (findControlReencauche(id) == null) {
                    throw new NonexistentEntityException("The controlReencauche with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ControlReencauche controlReencauche;
            try {
                controlReencauche = em.getReference(ControlReencauche.class, id);
                controlReencauche.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The controlReencauche with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<DetalleControlReencauche> detalleControlReencaucheListOrphanCheck = controlReencauche.getDetalleControlReencaucheList();
            for (DetalleControlReencauche detalleControlReencaucheListOrphanCheckDetalleControlReencauche : detalleControlReencaucheListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This ControlReencauche (" + controlReencauche + ") cannot be destroyed since the DetalleControlReencauche " + detalleControlReencaucheListOrphanCheckDetalleControlReencauche + " in its detalleControlReencaucheList field has a non-nullable idControlReencauche field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Usuarios idUsuario = controlReencauche.getIdUsuario();
            if (idUsuario != null) {
                idUsuario.getControlReencaucheList().remove(controlReencauche);
                idUsuario = em.merge(idUsuario);
            }
            DistribuidoresNeumaticos idDistribuidorNeumaticos = controlReencauche.getIdDistribuidorNeumaticos();
            if (idDistribuidorNeumaticos != null) {
                idDistribuidorNeumaticos.getControlReencaucheList().remove(controlReencauche);
                idDistribuidorNeumaticos = em.merge(idDistribuidorNeumaticos);
            }
            em.remove(controlReencauche);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ControlReencauche> findControlReencaucheEntities() {
        return findControlReencaucheEntities(true, -1, -1);
    }

    public List<ControlReencauche> findControlReencaucheEntities(int maxResults, int firstResult) {
        return findControlReencaucheEntities(false, maxResults, firstResult);
    }

    private List<ControlReencauche> findControlReencaucheEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from ControlReencauche as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ControlReencauche findControlReencauche(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ControlReencauche.class, id);
        } finally {
            em.close();
        }
    }

    public int getControlReencaucheCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from ControlReencauche as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
